home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / Games / NeXTGo / Source / findpatn.c < prev    next >
C/C++ Source or Header  |  1993-02-08  |  3KB  |  159 lines

  1. #include "comment.header"
  2.  
  3. #define EMPTY 0
  4.  
  5. extern unsigned char p[19][19];
  6. extern int opn[9];
  7. extern int MAXX, MAXY, currentStone;
  8. extern int opening(int*,int*,int*,int);
  9. extern int openregion(int,int,int,int);
  10. extern int matchpat(int,int,int*,int*,int*);
  11.  
  12. int findpatn(int *i, int *j, int *val)
  13.      /* find pattern to match for next move */
  14. {
  15.   int m, n;
  16.   int ti, tj, tval;
  17.   static int cnd, mtype;  /* game tree node number, move type */
  18.   /* mtype = 0, basic; 1, inverted; 2, reflected; 3, inverted & reflected */
  19.   
  20.   /* open game then occupy corners */
  21.   if (opn[4])   /* continue last move */
  22.     {
  23.       opn[4] = 0;  /* clear flag */
  24.       if (opening(i, j, &cnd, mtype)) opn[4] = 1; /* more move then reset flag */
  25.       if (p[*i][*j] == EMPTY)  /* valid move */
  26.     {
  27.       *val = 80;
  28.       return 1;
  29.     }
  30.       else
  31.     opn[4] = 0;
  32.     }
  33.   
  34.   if (opn[0])   /* Northwest corner */
  35.     {
  36.       opn[0] = 0;  /* clear flag */
  37.       if (openregion(0, 0, 5, 5))
  38.     {
  39.       cnd = 0;
  40.       mtype = 0;
  41.       opening(i, j, &cnd, mtype);  /* get new node for next move */
  42.       if (opening(i, j, &cnd, mtype)) opn[4] = 1;
  43.       *val = 80;
  44.       return 1;
  45.     }
  46.     }
  47.   
  48.   if (opn[1])   /* Southwest corner */
  49.     {
  50.       opn[1] = 0;
  51.       if (openregion(MAXX - 6, 0, MAXX - 1, 5))
  52.     {
  53.       cnd = 0;
  54.       mtype = 1;
  55.       opening(i, j, &cnd, mtype);  /* get new node for next move */
  56.       if (opening(i, j, &cnd, mtype)) opn[4] = 1;
  57.       *val = 80;
  58.       return 1;
  59.     }
  60.     }
  61.   
  62.   if (opn[2])   /* Northeast corner */
  63.     {
  64.       opn[2] = 0;
  65.       if (openregion(0, MAXY - 6, 5, MAXY - 1))
  66.     {
  67.       cnd = 0;
  68.       mtype = 2;
  69.       opening(i, j, &cnd, mtype);  /* get new node for next move */
  70.       if (opening(i, j, &cnd, mtype)) opn[4] = 1;
  71.       *val = 80;
  72.       return 1;
  73.     }
  74.     }
  75.   
  76.   if (opn[3])   /* Northeast corner */
  77.     {
  78.       opn[3] = 0;
  79.       if (openregion(MAXX - 6, MAXY - 6, MAXX - 1, MAXY - 1))
  80.     {
  81.       cnd = 0;
  82.       mtype = 3;
  83.       opening(i, j, &cnd, mtype);  /* get new node for next move */
  84.       if (opening(i, j, &cnd, mtype)) opn[4] = 1;
  85.       *val = 80;
  86.       return 1;
  87.     }
  88.     }
  89.   
  90.   /* occupy edges */
  91.   if (opn[5])   /* North edge */
  92.     {
  93.       opn[5] = 0;
  94.       if (openregion(0, (MAXY/2) - 3, 4, (MAXY/2) + 2))
  95.     {
  96.       *i = 3;
  97.       *j = MAXY/2;
  98.       *val = 80;
  99.       return 1;
  100.     }
  101.     }
  102.   
  103.   if (opn[6])   /* South edge */
  104.     {
  105.       opn[6] = 0;
  106.       if (openregion(MAXX - 1, (MAXY/2) - 3, MAXX - 5, (MAXY/2) + 2))
  107.     {
  108.       *i = MAXX - 4;
  109.       *j = MAXY/2;
  110.       *val = 80;
  111.       return 1;
  112.     }
  113.     }
  114.   
  115.   if (opn[7])   /* West edge */
  116.     {
  117.       opn[7] = 0;
  118.       if (openregion((MAXX/2) - 3, 0, (MAXX/2) + 2, 4))
  119.     {
  120.       *i = MAXX/2;
  121.       *j = 3;
  122.       *val = 80;
  123.       return 1;
  124.     }
  125.     }
  126.   
  127.   if (opn[8])   /* East edge */
  128.     {
  129.       opn[8] = 0;
  130.       if (openregion((MAXX/2) - 3, MAXY - 1, (MAXX/2) + 2, MAXY - 5))
  131.     {
  132.       *i = MAXX/2;
  133.       *j = MAXY - 4;
  134.       *val = 80;
  135.       return 1;
  136.     }
  137.     }
  138.   
  139.   *i = -1;
  140.   *j = -1;
  141.   *val = -1;
  142.   
  143.   /* find local pattern */
  144.   for (m = 0; m < MAXX; m++)
  145.     for (n = 0; n < MAXY; n++)
  146.       if ((p[m][n] == currentStone) &&
  147.       (matchpat(m, n, &ti, &tj, &tval) && (tval > *val)))
  148.     {
  149.       *val = tval;
  150.       *i = ti;
  151.       *j = tj;
  152.     }
  153.   if (*val > 0)  /* pattern found */
  154.     return 1;
  155.   else  /* no match found */
  156.     return 0;
  157. }  /* end findpatn */
  158.  
  159.